import {
  Module,
  NestModule,
  MiddlewareConsumer,
  RequestMethod,
} from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { LoginModule } from './login/login.module';
import { LoginController } from './login/login.controller';
import { MongooseModule } from '@nestjs/mongoose';
import { Cat, login } from './login/login.field';
import { ShopController } from './shop/shop.controller';
import { ShopModule } from './shop/shop.module';
import { shopName, shop } from './shop/shop.fiele';
import { UserssionController } from './userssion/userssion.controller';
import { UserssionModule } from './userssion/userssion.module';
import { WinstonModule } from 'nest-winston';
import { APP_FILTER, APP_INTERCEPTOR } from '@nestjs/core';
import * as winston from 'winston';
import 'winston-daily-rotate-file';
import UnifyExceptionFilter from './log/uinify-exception.filter';
import logger from './log/logger.middleware';
import { UnifyResponseInterceptor } from './log/unify-response.interceptor';

@Module({
  imports: [
    MongooseModule.forRoot('mongodb://127.0.0.1:27017/studentsList', {
      useNewUrlParser: true,
    }),
    MongooseModule.forFeature([
      {
        name: Cat.name,
        schema: login, // 引入对应的表
        collection: 'loginList', // 表名称
      },
    ]),
    MongooseModule.forFeature([
      {
        name: shopName.name,
        schema: shop, // 引入对应的表
        collection: 'shopList', // 表名称
      },
    ]),
    // 日志配置
    WinstonModule.forRoot({
      transports: [
        new winston.transports.DailyRotateFile({
          dirname: `logs`, // 日志保存的目录
          // dirname: `D:\\`, // 日志保存的目录 // 保存到本地
          filename: '%DATE%.log', // 日志名称，占位符 %DATE% 取值为 datePattern 值。
          datePattern: 'YYYY-MM-DD', // 日志轮换的频率，此处表示每天。
          zippedArchive: true, // 是否通过压缩的方式归档被轮换的日志文件。
          maxSize: '20m', // 设置日志文件的最大大小，m 表示 mb 。
          maxFiles: '14d', // 保留日志文件的最大天数，此处表示自动删除超过 14 天的日志文件。
          // 记录时添加时间戳信息
          format: winston.format.combine(
            winston.format.timestamp({
              format: 'YYYY-MM-DD HH:mm:ss',
            }),
            winston.format.json(),
          ),
        }),
      ],
    }),
    LoginModule,
    ShopModule,
    UserssionModule,
  ],
  controllers: [
    AppController,
    LoginController,
    ShopController,
    UserssionController,
  ],
  providers: [
    AppService,
    // ...
    // 应用全局过滤器
    {
      provide: APP_FILTER,  
      useClass: UnifyExceptionFilter,
    },
    // 应用拦截器
    {
      provide: APP_INTERCEPTOR,
      useClass: UnifyResponseInterceptor,
    },
  ],
})
// export class AppModule {}
export class AppModule implements NestModule {
  // 应用全局中间件
  configure(consumer: MiddlewareConsumer) {
    consumer.apply(logger).forRoutes({ path: '*', method: RequestMethod.ALL });
  }
}
